Electron IPC 通信详解
IPC = 进程间通信。主进程和渲染进程是隔离的,想交流就得通过 IPC。
先分清两个进程
重点:渲染进程跑在浏览器环境,不能直接碰 Node.js 和系统资源。想用?通过 IPC 让主进程帮忙。
为什么需要 preload?
如果直接在渲染进程里 require('electron') 用 ipcRenderer:
- 不安全:网页里的恶意脚本也能调 IPC
- Electron 默认禁止:
contextIsolation: true、nodeIntegration: false
解决方案:用 preload 做中间人,只暴露你允许的方法:
三种通信方式
1. invoke/handle —— 双向通信 ⭐ 最常用
场景:渲染进程需要从主进程拿数据或执行操作,还要等结果回来。
例子:读取文件、获取版本号、调用系统 API
主进程 main.js:
preload.js:
渲染进程(页面 JS):
2. send/on —— 单向通信
场景:只管发,不等回复。适合日志、通知、触发操作。
例子:记录日志、窗口最小化
主进程 main.js:
preload.js:
渲染进程:
3. 主进程主动推送
场景:主进程有新消息要告诉渲染进程。
例子:下载进度、系统通知、后台任务完成
主进程 main.js:
preload.js:
渲染进程:
electron-vite 项目结构
src/preload/index.ts:
src/main/index.ts:
Vue/React 组件中使用:
踩坑记录 ⚠️
1. 监听器要清理
ipcRenderer.on 注册的监听器,组件销毁时要移除,不然内存泄漏:
2. 别暴露整个 ipcRenderer
3. 别用 sendSync
ipcRenderer.sendSync() 会阻塞整个渲染进程,页面卡死。永远用 invoke 代替。
4. handle 的错误处理
ipcMain.handle 里 throw 的错误,会在 ipcRenderer.invoke 那边变成 rejected Promise:
速查表
记忆口诀
- 双向通信用 invoke/handle:渲染进程要拿数据,主进程处理后返回
- 单向发信用 send/on:只管发,不等回复
- 主进程反向推用 webContents.send:主进程主动通知渲染进程
- 安全第一用 preload:别暴露整个 ipcRenderer,只暴露需要的方法

